deriving strategy
derivingの仕方には複数の方法がありうる
つまりある型クラスをいくつかの方法で導出しうる
コンパイラはその中から適切なものを選択しないといけない
特定の導出方法はderiving strategyと呼ばれる
型クラスとデータ型の組み合わせによって使用できる戦略が複数ある場合もある
その場合は、DerivingStrategiesを使ってどれを使うのか明示する
明示していない場合は、GHCの基準によって、どれかが選択される
https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/deriving-strategies#the-deriving-strategy-resolution-algorithm
基本的な4つのderiving strategy
stock (deriving)
標準のderiving strategy
普通にderiving (Show)みたいに書くやつ
コンパイラが用意したderivingアルゴリズムを使用してderivingする
https://kowainik.github.io/posts/deriving#standard-deriving
対象の型クラス
Eq
Ord
Show
Read
Enum
Bounded
Ix型クラス
newtype (deriving)
Haskellのnewtypeで作られた型に対するderiving
元の型のinstance実装を流用する
https://kowainik.github.io/posts/deriving#newtypes
GeneralizedNewtypeDeriving
anyclass (deriving)
https://kowainik.github.io/posts/deriving#any-class-derivations
DeriveAnyClass
任意の型クラスをderivingできる
instanceを空の実装としてderivingする
型クラスにdefaultの定義がある場合は、それを利用する
via (deriving)
DerivingVia
同型な2つの型があったときに、型クラスのinstanceの実装を共有する
指定されたcastできる範囲のデータ型のinstanceを流用する
Kowainikによるその他のderiving戦略の分類
これと上の基本的な4つとの違い、スタンスの違いがよくわからんmrsekut.icon
Auto derived
https://kowainik.github.io/posts/deriving#auto-derived
対象の型クラス
Typeable型クラス
Coercible型クラス
HasField型クラス
常にGHCがinstanceを定義してくれる
やろうと思えば手動でも定義できるらしい
Derive Whatever
https://kowainik.github.io/posts/deriving#derive-whatever
DeriveFunctor
DeriveFoldable
DeriveTraversable
DeriveGeneric
DeriveDataTypeable
DeriveLift
Standalone deriving
https://kowainik.github.io/posts/deriving#standalone-deriving
StandaloneDeriving
Empty Deriving
https://kowainik.github.io/posts/deriving#empty-deriving
EmptyDataDeriving
型の数が0の型に対してもderivingできるようになる
deriving strategy resolution
GHCはderiving句を見つけると、deriving句内に書かれてある全ての型クラスのstrategyを関連付ける
このプロセスのことをこう呼ぶ
https://www.reddit.com/r/haskell/comments/7dftvv/the_deriving_strategy_resolution_algorithm/
参考
Strategic Deriving :: Kowainik
一つ一つの戦略についても1節割いて説明がある
続くといいな日記 – DerivingVia で deriving 戦略を模倣する
DerivingViaに関する記事だが、前半にderiving strategyの概要がある
DerivingViaを使えば、他の戦略も模倣できるよ、ということが書かれてある
https://qiita.com/mod_poppo/items/1867d06f8a9903441e3c
https://aiya000.github.io/Maid/haskell-day-2019-deriving/#/